package com.mazaiting.manager.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.mazaiting.common.core.ex.exceptions.BaseException;
import com.mazaiting.common.core.ex.exceptions.EmptyObjectException;
import com.mazaiting.web.domain.SingleResult;
import com.mazaiting.manager.domain.entity.SysUser;
import com.mazaiting.manager.domain.form.UserForm;
import com.mazaiting.manager.domain.query.UserPageQuery;
import com.mazaiting.manager.domain.vo.user.*;
import com.mazaiting.manager.dto.UserAuthDTO;
import com.mazaiting.mybatisplus.domain.vo.BasePageVO;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * sys_user用户表 服务类
 *
 * @author 党海亮
 * @since 2022-03-22
 */
public interface ISysUserService extends IService<SysUser> {

    /**
     * 登录用户信息
     * @return 登录用户信息
     */
    LoginUserVO getLoginUserInfo() throws EmptyObjectException;

    /**
     * 用户分页列表
     * @param queryParams 查询参数
     * @return 用户列表
     */
    BasePageVO<SysUserVO> listUserPages(UserPageQuery queryParams);

    /**
     * 根据用户 ID 获取用户详情
     * @param userId 用户 ID
     * @return 用户详情
     */
    UserDetailVO getUserDetail(Long userId) throws EmptyObjectException;

    /**
     * 更新用户
     * @param userForm 用户表单数据
     * @return true: 更新成功; false: 更新失败
     */
    @Transactional(rollbackFor = Exception.class)
    boolean update(UserForm userForm) throws BaseException;

    /**
     * 新增用户
     * @param userForm 用户表单数据
     * @return true: 新增成功; false: 新增失败
     */
    @Transactional(rollbackFor = Exception.class)
    boolean save(UserForm userForm) throws BaseException;

    /**
     * 根据 ID 列表删除用户
     * @param ids id 列表
     * @return true: 删除成功; false: 删除失败
     */
    @Transactional(rollbackFor = Exception.class)
    boolean delete(String ids) throws BaseException;

    /**
     * 修改用户密码
     * @param userId 用户 ID
     * @param password 密码
     * @return true: 修改成功; false: 修改失败
     */
    boolean updatePassword(Long userId, String password) throws EmptyObjectException;

    /**
     * 修改用户状态
     * @param userId 用户 ID
     * @param enabled 用户状态
     * @return true: 修改成功; false: 修改失败
     */
    boolean updateEnabled(Long userId, Boolean enabled) throws EmptyObjectException;

    /**
     * 根据用户名获取认证信息
     * @param username 用户名
     * @return 认证信息
     */
    UserAuthDTO getAuthInfoByUsername(String username) throws EmptyObjectException;

    /**
     * 根据手机号获取认证信息
     *
     * @param mobile 手机号
     * @return 用户认证信息
     */
    UserAuthDTO getAuthInfoByMobile(String mobile) throws EmptyObjectException;

    /**
     * 根据查询条件查询数据并导出
     * @param queryParams 查询条件
     * @return 导出数据列表
     */
    List<UserExportVO> listExportUsers(UserPageQuery queryParams);

    /**
     * 导入用户
     *
     * @param userImportVO 导入用户的 VO
     * @return 异常信息
     */
    @Transactional(rollbackFor = Exception.class)
    SingleResult importUsers(UserImportVO userImportVO) throws Exception;
}
